import Vue from 'vue';
import VueRouter from 'vue-router';
import routes from './routes';

Vue.use(VueRouter);
// 引入store
import store from '@/store';

// 先把VueRouter原型对象的push, 先保存一份
// 先把VueRouter原型对象的replace, 先保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;

// 重写push|replace
VueRouter.prototype.push = function (location, resolve, reject) {
	if (resolve && reject) {
		originPush.call(this, location, resolve, reject);
	} else {
		originPush.call(
			this,
			location,
			() => {},
			() => {}
		);
	}
};

VueRouter.prototype.replace = function (location, resolve, reject) {
	if (resolve && reject) {
		originReplace.call(this, location, resolve, reject);
	} else {
		originReplace.call(
			this,
			location,
			() => {},
			() => {}
		);
	}
};
// 对外暴露VueRouter类的实例
const router = new VueRouter({
	// mode: 'history',
	base: process.env.BASE_URL,
	routes,
	// 滚动行为
	scrollBehavior(to, from, savedPosition) {
		// y=0, 代表始终滚动到顶部
		return { y: 0 };
	},
});
// 全局守卫:前置守卫(在路由跳转之前进行判断)
router.beforeEach(async (to, from, next) => {
	// to:可以获取到你要跳转到哪个路由信息
	// from:可以获取到从哪个路由来的信息
	// next:放行函数	next()放行	next('路径')放行到指定路由	next(false)
	// next();
	// 用户登录了,才会有token,未登录一定不会有token
	let token = store.state.user.token;
	// 用户信息
	let name = store.state.user.userInfo.name;
	// 用户已经登录了
	if (token) {
		// 用户已经登录了还想去login不能去,停留在首页
		if (to.path == '/login' || to.path == '/register') {
			next('/');
		} else {
			// 登录了,但去的不是login
			// 如果用户名已有
			if (name) {
				next();
			} else {
				// 没有用户信息,派发action让仓库存储用户信息再跳转
				try {
					// 获取用户信息成功
					await store.dispatch('getUserInfo');
					// 放行
					next();
				} catch (error) {
					// token失效,获取不到用户信息, 重新登录
					// 清除token
					await store.dispatch('userLogout');
					next('/login');
				}
			}
		}
	} else {
		// 未登录不能去交易相关,不能去支付相关[pay paysuccess],不能去个人中心
		// 未登录去上面这些路由 ---> 登录
		let toPath = to.path;
		if (
			toPath.indexOf('/trade') != -1 ||
			toPath.indexOf('/pay') != -1 ||
			toPath.indexOf('/center') != -1
		) {
			// 把未登录的时候想去而没去成的信息, 存储于地址栏中[路由]
			next('/login?redirect=' + toPath);
		} else {
			// 去的不是上面的这些路由(home|search|shopCart) ---> 放行
			next();
		}
	}
});

export default router;
